import type { IBaseEntity, ITimeRange } from '../common/base';
import type { DayOfWeekEnum, ScheduleTemplateStatusEnum } from './enums';

/**
 * 课程安排模板实体接口
 * @description 课程安排模板的完整信息结构
 */
export interface IScheduleTemplate extends IBaseEntity {
  /** 关联学生ID */
  studentId: string;
  /** 关联课程ID */
  courseId: string;
  /** 课程开始日期 */
  startDate: string;
  /** 开始时间 */
  startTime: string;
  /** 结束时间 */
  endTime: string;
  /** 星期几 (1-7) */
  dayOfWeek: DayOfWeekEnum;
  /** 总次数 */
  totalCount: number;
  /** 已完成次数 */
  completedCount: number;
  /** 已取消次数 */
  cancelledCount: number;
  /** 教室地点 */
  location?: string;
  /** 备注信息 */
  remark?: string;
  /** 模板状态 */
  status: ScheduleTemplateStatusEnum;
  /** 结束日期（根据开始日期、总次数、星期计算得出） */
  endDate?: string;
  /** 课程费用（单次） */
  feePerSession?: number;
  /** 总费用 */
  totalFee?: number;
  /** 已支付费用 */
  paidFee?: number;
  /** 是否允许补课 */
  allowMakeup: boolean;
  /** 最大补课次数 */
  maxMakeupCount?: number;
  /** 当前补课次数 */
  currentMakeupCount: number;
  /** 提醒设置 */
  reminderSettings?: {
    /** 是否启用提醒 */
    enabled: boolean;
    /** 提前提醒时间（分钟） */
    advanceMinutes: number;
    /** 提醒方式 */
    methods: ('notification' | 'email' | 'sms')[];
  };
}

/**
 * 课程安排模板创建请求
 * @description 创建课程安排模板时需要的数据
 */
export type IScheduleTemplateCreateRequest = Omit<
  IScheduleTemplate, 
  'id' | 'createdAt' | 'updatedAt' | 'completedCount' | 'cancelledCount' | 'endDate' | 'currentMakeupCount'
>;

/**
 * 课程安排模板更新请求
 * @description 更新课程安排模板信息时的数据
 */
export type IScheduleTemplateUpdateRequest = Partial<IScheduleTemplateCreateRequest> & {
  /** 模板ID */
  id: string;
};

/**
 * 课程安排模板查询参数
 * @description 查询课程安排模板时的筛选条件
 */
export interface IScheduleTemplateQueryParams {
  /** 学生ID */
  studentId?: string;
  /** 学生ID列表 */
  studentIds?: string[];
  /** 课程ID */
  courseId?: string;
  /** 课程ID列表 */
  courseIds?: string[];
  /** 星期几 */
  dayOfWeek?: DayOfWeekEnum;
  /** 星期几列表 */
  dayOfWeeks?: DayOfWeekEnum[];
  /** 模板状态 */
  status?: ScheduleTemplateStatusEnum;
  /** 模板状态列表 */
  statuses?: ScheduleTemplateStatusEnum[];
  /** 开始日期范围 - 开始 */
  startDateFrom?: string;
  /** 开始日期范围 - 结束 */
  startDateTo?: string;
  /** 时间范围 - 开始时间 */
  timeFrom?: string;
  /** 时间范围 - 结束时间 */
  timeTo?: string;
  /** 教室地点 */
  location?: string;
  /** 是否允许补课 */
  allowMakeup?: boolean;
  /** 是否有剩余次数 */
  hasRemainingCount?: boolean;
}

/**
 * 课程安排模板统计信息
 * @description 课程安排模板相关的统计数据
 */
export interface IScheduleTemplateStatistics {
  /** 模板总数 */
  totalCount: number;
  /** 进行中的模板数 */
  activeCount: number;
  /** 已完成的模板数 */
  completedCount: number;
  /** 已暂停的模板数 */
  suspendedCount: number;
  /** 已取消的模板数 */
  cancelledCount: number;
  /** 按学生分组统计 */
  studentDistribution: Array<{
    studentId: string;
    studentName: string;
    templateCount: number;
    totalSessions: number;
    completedSessions: number;
  }>;
  /** 按课程分组统计 */
  courseDistribution: Array<{
    courseId: string;
    courseName: string;
    templateCount: number;
    totalSessions: number;
    completedSessions: number;
  }>;
  /** 按星期分组统计 */
  dayOfWeekDistribution: Array<{
    dayOfWeek: DayOfWeekEnum;
    templateCount: number;
  }>;
  /** 按时间段分组统计 */
  timeSlotDistribution: Array<{
    timeSlot: string;
    templateCount: number;
  }>;
}

/**
 * 课程安排模板简要信息
 * @description 用于列表显示的模板简要信息
 */
export interface IScheduleTemplateSummary {
  /** 模板ID */
  id: string;
  /** 学生ID */
  studentId: string;
  /** 学生姓名 */
  studentName: string;
  /** 课程ID */
  courseId: string;
  /** 课程名称 */
  courseName: string;
  /** 课程颜色 */
  courseColor: string;
  /** 星期几 */
  dayOfWeek: DayOfWeekEnum;
  /** 开始时间 */
  startTime: string;
  /** 结束时间 */
  endTime: string;
  /** 总次数 */
  totalCount: number;
  /** 已完成次数 */
  completedCount: number;
  /** 剩余次数 */
  remainingCount: number;
  /** 模板状态 */
  status: ScheduleTemplateStatusEnum;
  /** 教室地点 */
  location?: string;
}

/**
 * 课程安排模板详情
 * @description 包含关联数据的模板详情
 */
export interface IScheduleTemplateDetail extends IScheduleTemplate {
  /** 关联的学生信息 */
  student: {
    id: string;
    name: string;
    studentId: string;
    phone?: string;
  };
  /** 关联的课程信息 */
  course: {
    id: string;
    name: string;
    courseCode: string;
    teacher: string;
    color: string;
  };
  /** 剩余次数 */
  remainingCount: number;
  /** 下次上课日期 */
  nextSessionDate?: string;
  /** 最近一次上课日期 */
  lastSessionDate?: string;
  /** 课程实例列表 */
  instances?: Array<{
    id: string;
    date: string;
    status: string;
  }>;
}

/**
 * 课程安排模板批量操作请求
 * @description 批量操作模板的请求参数
 */
export interface IScheduleTemplateBatchRequest {
  /** 模板ID列表 */
  templateIds: string[];
  /** 操作类型 */
  action: 'suspend' | 'resume' | 'complete' | 'cancel' | 'delete';
  /** 操作原因 */
  reason?: string;
  /** 操作参数 */
  params?: Record<string, unknown>;
}

/**
 * 课程安排模板批量操作响应
 * @description 批量操作模板的响应结果
 */
export interface IScheduleTemplateBatchResponse {
  /** 成功的模板ID列表 */
  success: string[];
  /** 失败的模板ID列表 */
  failed: string[];
  /** 失败详情 */
  errors?: Array<{
    templateId: string;
    error: string;
  }>;
}